//package com.jsb.laundry.controller;
//
//import com.alibaba.fastjson.JSONObject;
//import com.jsb.laundry.common.config.properties.WechatMiniPayProperties;
//import com.jsb.laundry.common.enums.ReturnStatusCode;
//import com.jsb.laundry.common.response.WebResponse;
//import com.jsb.laundry.common.utils.JSBUtil;
//import com.jsb.laundry.common.utils.http.EncryptUtil;
//import com.jsb.laundry.common.utils.http.HttpUtil;
//import com.jsb.laundry.common.utils.redis.RedisUtil;
//import com.jsb.laundry.dao.UserInfoDao;
//import com.jsb.laundry.model.dto.CouponRecord;
//import com.jsb.laundry.model.dto.Promotion;
//import com.jsb.laundry.model.dto.UserDetailDto;
//import com.jsb.laundry.model.dto.UserInfoDto;
//import com.jsb.laundry.model.entity.CapitalAccount;
//import com.jsb.laundry.model.entity.UserDetail;
//import com.jsb.laundry.service.UserInfoService;
//import io.swagger.annotations.Api;
//import io.swagger.annotations.ApiImplicitParam;
//import io.swagger.annotations.ApiImplicitParams;
//import io.swagger.annotations.ApiOperation;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.data.redis.core.RedisTemplate;
//import org.springframework.transaction.annotation.Transactional;
//import org.springframework.web.bind.annotation.GetMapping;
//import org.springframework.web.bind.annotation.RequestMapping;
//import org.springframework.web.bind.annotation.RequestParam;
//import org.springframework.web.bind.annotation.RestController;
//
//import javax.annotation.Resource;
//import java.time.LocalDate;
//import java.time.LocalDateTime;
//import java.time.ZoneId;
//import java.util.Date;
//import java.util.HashMap;
//import java.util.Random;
//import java.util.concurrent.TimeUnit;
//
///**
// * 小程序登录
// */
//@Api(tags = {"登录"})
//@RestController
//@RequestMapping("/mini")
//public class UserLoginController1 {
//
//    private static final Logger LOGGER = LoggerFactory.getLogger(UserLoginController1.class);
//
//    @Resource
//    private RedisTemplate redisTemplate;
//
//    @Resource
//    private WechatMiniPayProperties wechatMiniPayProperties;
//
//    @Resource
//    private UserInfoService userInfoService;
//
//    @Resource
//    private UserInfoDao userInfoDao;
//
//
//    @Resource
//    private RedisUtil redisUtil;
//
//    /**
//     * 微信登录
//     *
//     * @param js_code   获取openid等信息
//     * @param code      用于获取手机号
//     * @param appUserId 邀请人ID
//     * @param couponId  优惠券id
//     * @param userType  邀请人用户的类型 （0：小程序，1：骑手）
//     * @return
//     */
//    @ApiOperation(value = "微信小程序登录", notes = "微信小程序登录", httpMethod = "GET")
//    @ApiImplicitParams({
//            @ApiImplicitParam(name = "js_code", value = "获取openid等信息", required = true, paramType = "query", dataType = "String"),
//            @ApiImplicitParam(name = "code", value = "用于获取手机号", required = true, paramType = "query", dataType = "String"),
//            @ApiImplicitParam(name = "appUserId", value = "邀请人id", required = false, paramType = "query", dataType = "String"),
//            @ApiImplicitParam(name = "couponId", value = "优惠券id", required = false, paramType = "query", dataType = "String"),
//            @ApiImplicitParam(name = "userType", value = "邀请人用户的类型 (0：小程序，1：骑手)", required = false, paramType = "query", dataType = "String"),
//    })
//    @GetMapping("/login")
//    @Transactional
//    public WebResponse<UserDetail> login(@RequestParam("js_code") String js_code, @RequestParam("code") String code,
//                                         @RequestParam(required = false, value = "appUserId") String appUserId,
//                                         @RequestParam(required = false, value = "couponId") String couponId,
//                                         @RequestParam(required = false, value = "userType") int userType) {
//        if (JSBUtil.isEmptyString(js_code) || JSBUtil.isEmptyString(code) || "undefined".equals(code)) {
//            return WebResponse.success(ReturnStatusCode.WX_LOGIN_ERROR.getCode(), ReturnStatusCode.WX_LOGIN_ERROR.getMsg());
//        }
//
//
//        /**
//         * js_code获取open_id
//         */
//        String url = String.format("https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code", wechatMiniPayProperties.getAppId(), wechatMiniPayProperties.getAppSecret(), js_code);
//        //https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
//        String s = HttpUtil.sendGet(url, null, null, null);
//        JSONObject jsonObject1 = JSONObject.parseObject(s);
//        String openid = jsonObject1.getString("openid");
//        String session_key = jsonObject1.getString("session_key");
//        String unionid = jsonObject1.getString("unionid");
//
//        /**
//         * 没有拿到openid 返回错误结果
//         */
//        if (JSBUtil.isEmptyString(openid)) {
//            return WebResponse.success(ReturnStatusCode.WX_LOGIN_ERROR.getCode(), ReturnStatusCode.WX_LOGIN_ERROR.getMsg());
//        }
//
//        /**
//         * 获取access_token
//         */
//        String access_tokens = redisUtil.getCacheObject("wx_user_access_token");
//        if (JSBUtil.isEmptyString(access_tokens)) {
//
//            String accessTokenUrl = String.format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s", wechatMiniPayProperties.getAppId(), wechatMiniPayProperties.getAppSecret());
//            String s1 = HttpUtil.sendGet(accessTokenUrl, null, null, null);
//            JSONObject jsonObject2 = JSONObject.parseObject(s1);
//            String access_token = jsonObject2.getString("access_token");
//
////            String accessTokenUrl = String.format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s", wechatMiniPayProperties.getAppId(), wechatMiniPayProperties.getAppSecret());
////            String s1 = HttpUtil.sendGet(accessTokenUrl, null, null, null);
////            String access_token = JSONObject.parseObject(s1).getString("access_token");
//            LOGGER.info("access_token:" + access_token);
//            access_tokens = access_token;
//            redisUtil.setCacheObject("wx_user_access_token", access_tokens, 1, TimeUnit.HOURS); //1小时过期
////            WechatAccessToken.getAccessToken();
////            access_tokens = redisUtil.getCacheObject("wx_user_access_token");
//        }
//
//        /**
//         * 获取手机号
//         */
//        String getUserPhoneUrl = String.format("https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=%s", access_tokens);
//        JSONObject jsonCode = new JSONObject();
//        jsonCode.put("code", code);
//        String s2 = HttpUtil.sendPost(getUserPhoneUrl, null, JSONObject.toJSONString(jsonCode));
//        LOGGER.info("获取手机号api返回：{}",s2);
//        if (s2.indexOf("purePhoneNumber") == -1) {
//            return WebResponse.success(ReturnStatusCode.PUREPHONENUMBER_NOT_FOUND.getCode(), ReturnStatusCode.PUREPHONENUMBER_NOT_FOUND.getMsg());
//        }
//        JSONObject jsonObject3 = JSONObject.parseObject(s2);
//        JSONObject phoneInfo = JSONObject.parseObject(jsonObject3.getString("phone_info"));
//        String purePhoneNumber = phoneInfo.getString("purePhoneNumber");
//
//
//        /**
//         * TODO 是否为新用户
//         *      如果存在则登录,不存在则注册
//         */
//        String userId = userInfoService.getUserIdByOpenid(openid);
//
//        /**
//         * 判断这个openid 不存在就注册
//         */
//        if (JSBUtil.isEmptyString(userId)) { //新用户
//
//            //TODO userId生成处
//            String newUserId = JSBUtil.generateUUID();
//            userId = newUserId;
//
//            //保存用户信息
//            boolean success = registerUserInfo(userId, openid, purePhoneNumber, session_key, unionid);
//            if (success == false) { //信息添加失败
//                return WebResponse.success(ReturnStatusCode.WX_LOGIN_ERROR.getCode(), ReturnStatusCode.WX_LOGIN_ERROR.getMsg());
//            }
//
//            String inviterUserOpenId = null;
//            int riderOpenId = 0;
//            if (userType == 0) { //用户邀请用户
//                inviterUserOpenId = userInfoService.getOpenIdByUserId(appUserId);
//            } else { //骑手邀请用户
//                riderOpenId = userInfoDao.getRiderOpenId(appUserId);
//            }
//
//            /**
//             * 骑手邀请用户 （给骑手奖励 laundry_rider_info.user_money、添加邀请记录 rider_promotion）
//             */
//            if (userType == 1 && riderOpenId == 1
//                    && !JSBUtil.isEmptyString(appUserId) && !userId.equals(appUserId)) {
//                addInvitationRecordsAndBonus0(appUserId, userId);
//            }
//
//            /**
//             * 用户邀请用户
//             * 有邀请人id,邀请人id必须是我们存在的用户,不可以自己邀请自己(避免特殊情况),则添加邀请记录
//             */
//            else if (userType == 0 && !JSBUtil.isEmptyString(appUserId)
//                    && !"null".equals(couponId) && !userId.equals(appUserId)
//                    && !JSBUtil.isEmptyString(inviterUserOpenId)) {   //分享优惠券
//                LOGGER.info("新用户：{},邀请人：{},通过点击分享的优惠券({})进入小程序", userId, appUserId, couponId);
//                addInvitationRecordsAndBonus1(userId, appUserId, couponId);
//            } else if (userType == 0 && !JSBUtil.isEmptyString(appUserId)
//                    && !userId.equals(appUserId)
//                    && !JSBUtil.isEmptyString(inviterUserOpenId)) { //分享套餐
//                LOGGER.info("新用户：{},邀请人：{},通过点击分享的套餐进入小程序", userId, appUserId);
//                addInvitationRecordsAndBonus2(userId, appUserId);
//            } else { //其他
//                LOGGER.info("新用户：{},邀请人：{},无奖励", userId, appUserId);
//            }
//
//
////            /**
////             * 分享二维码邀请用户
////             */
////            String userSId = userInfoDao.findByAppUserId(userId, appUserId);
////            //插入邀请人和被邀请人
////            if (userType == 0 && !JSBUtil.isEmptyString(userSId)) {
////                //查询数据库被邀请人id
////                Promotion promotion = new Promotion();
////                promotion.setUserId(userId);
////                promotion.setAppUserId(appUserId);
////
////                /**
////                 * 添加邀请记录 promotion
////                 */
////                userInfoDao.addInvitationRecord(promotion);
////                /**
////                 * 向账户中添加奖励 user_detail.user_amount
////                 */
////                int currentBonus = 20;
////                userInfoDao.updUserAccountInfo(appUserId, currentBonus);
////                /**
////                 * 添加金额奖励流水记录user_stream_record（当前奖励0.2元）
////                 */
////                String streamId = "stream-" + JSBUtil.generateUUID();
////                userInfoDao.addUserStreamRecord(streamId, appUserId, currentBonus);
////            }
//
//
//        }
//        //获取是否购买过优惠券
//        String vipFlag = userInfoDao.getUserCouponUsableNum(userId);
//
//        UserDetail userInfo = userInfoDao.getUserDetail(userId);
//
//        //token过期时间戳
//        long tokenExpireTimestamp = LocalDateTime.now().plusDays(30).atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
//        //TODO token生成处(uuid + userId() + timestamp(token过期的时间戳) )
//        String token = "wx_user_Authorization: " + JSBUtil.generateUUID() + ". " + EncryptUtil.Base64Tool.base64Encode(userId) + ". " + EncryptUtil.Base64Tool.base64Encode(String.valueOf(tokenExpireTimestamp));
//        //存在redis数据库
//        redisTemplate.opsForValue().set(token, userId, 30, TimeUnit.DAYS);
//        userInfo.setToken(token);
//        userInfo.setUserType("0");
//        userInfo.setVipFlag(vipFlag);
//
//
//        return WebResponse.successData(userInfo);
//    }
//
//
//    /**
//     * 注册用户信息
//     *
//     * @param userId
//     * @param openid
//     * @param purePhoneNumber
//     * @param session_key
//     * @return true:信息添加成功
//     */
//    public boolean registerUserInfo(String userId, String openid, String purePhoneNumber, String session_key, String unionId) {
//        UserInfoDto userInfoDto = new UserInfoDto();
//        userInfoDto.setUserId(userId);
//        userInfoDto.setUserPhone(purePhoneNumber);
//        userInfoDto.setSessionKey(session_key);
//        userInfoDto.setOpenId(openid);
//        userInfoDto.setUnionId(unionId);
//        userInfoDto.setLoginType("0");
//        userInfoDto.setDelFlag("0");
//        int var1 = userInfoDao.addUserInfo(userInfoDto);//注册用户的核心信息
//
//        UserDetailDto userDetail = new UserDetailDto();
//        userDetail.setUserId(userId);
//        userDetail.setUserAvatar("https://jsb-wx.oss-cn-shanghai.aliyuncs.com/userInfo/16b76972ce5d48c3a26bcd81e5e53681.png");
//        userDetail.setUserBirth("2022-11-07");
//        userDetail.setUserName("Jsb" + JSBUtil.getRandomStr(6));
//        userDetail.setUserSex("0");
//        userDetail.setUserPoints("0");
//        userDetail.setUserGrade("1");
//        int var2 = userInfoDao.addUserDetail(userDetail); //注册用户在平台上的帐号信息
//
//        CapitalAccount account = new CapitalAccount();
//        account.setThirdpartId(userId).setType("1");
//        int var3 = userInfoDao.addCapitalAccount(account); //账户表
//
//        if (var1 == 0 || var2 == 0 || var3 == 0) {
//            LOGGER.info("新用户注册信息失败,userId:{}", userId);
//            return false;
//        }
//        LOGGER.info("新用户注册信息成功,userId:{},openid:{}", userId, openid);
//        return true;
//    }
//
//    /**
//     * 骑手邀请用户给骑手 0.2~0.5元奖励
//     *
//     * @param appUserId
//     */
//    private void addInvitationRecordsAndBonus0(String appUserId, String userId) {
//        int bonus = generateRandomReward();
//        LOGGER.info("新用户：{},邀请人：{},通过骑手邀请进入小程序,奖励:{}元", userId, appUserId, bonus / 10.0);
//        userInfoDao.addRiderBonus(appUserId, bonus); // 给奖励 laundry_rider_info.user_money
//        userInfoDao.addRiderInvitationRecords(appUserId, userId); //添加邀请记录 rider_promotion
//    }
//
//    /**
//     * 0.2~0.5元奖励
//     *
//     * @return
//     */
//    public static int generateRandomReward() {
//        int[] rewards = {20, 30, 40, 50};
//        Random random = new Random();
//        int index = random.nextInt(rewards.length);
//        return rewards[index];
//    }
//
//    /**
//     * 添加邀请记录，给奖励
//     *
//     * @param userId    新人id
//     * @param appUserId 邀请人id
//     */
//    public void addInvitationRecordsAndBonus1(String userId, String appUserId, String couponId) {
//        LOGGER.info("用户id：{}", appUserId, "邀请,新人id：{}", userId);
//        //券是否被人领取过，被人领取过，没有下面奖励
//
//        Promotion promotion = new Promotion();
//        promotion.setUserId(userId);
//        promotion.setAppUserId(appUserId);
//        int var0 = userInfoDao.addInvitationRecord(promotion);//添加邀请记录
//
//        //向账户中添加奖励
//        /**
//         * 1.给邀请人奖励(新用户注册成功 => 0.2元 ) user_detail
//         */
//        int currentBonus = 20;
//        userInfoDao.updUserAccountInfo(appUserId, currentBonus);
//        /**
//         * 2.添加金额奖励流水记录user_stream_record（当前奖励0.2元）
//         */
//        String streamId = "stream-" + JSBUtil.generateUUID();
//        userInfoDao.addUserStreamRecord(streamId, appUserId, currentBonus);
//
//
//        /**
//         * 3.查询赠送了什么优惠券，系统就会给邀请人一张什么优惠券
//         */
//        //查看赠送的优惠券
//        HashMap couponInfo = userInfoDao.getCouponById(appUserId, couponId);
//        couponInfo.put("pay_id", "SYSTEM-" + JSBUtil.generateUUID());
//        couponInfo.put("create_time", new Date());
//        couponInfo.put("pay_time", new Date());
//        couponInfo.put("begin_time", new Date());
//        Date endTime = Date.from(LocalDate.now().plusMonths(1).atStartOfDay(ZoneId.systemDefault()).toInstant());
//        couponInfo.put("end_time", endTime);
//
//        couponInfo.put("use_type", "0"); //未使用
//        couponInfo.put("get_type", "1"); //系统赠送
//        couponInfo.put("user_received", "0");//系统赠送 是否被领取过（0：未领取，1：已被领取）
//
//
//        CouponRecord couponRecord = new CouponRecord();
//        couponRecord.setAppUserId(appUserId); //邀请人id
//        couponRecord.setCouponId(couponId); //优惠券id
//        couponRecord.setUserId(userId); //新用户id
//
//        int ok, var1, var2, var3;
//        ok = var1 = var2 = var3 = 0;
//        //邀请人获取 优惠券是否被人领取，同一张优惠券被多人领取时只发放一张给邀请人 (0:未被领取过，1：被人领取过)
//        int var4 = userInfoDao.findCouponReceiveStatus(appUserId, couponId);
//        if (var4 == 0) {
//            //系统赠送优惠券给邀请人(在邀请人用户的待领取列表中,用户领取后才可使用)
//            ok = userInfoDao.addSystemCoupon(couponInfo);
//            //将优惠券赠送他人（优惠券被使用）
//            var1 = userInfoDao.shareCoupon(couponRecord);
//            //被赠送的优惠券（优惠券被人领取）(邀请人id、新用户id、优惠券id)
//            var2 = userInfoDao.updCouponStatus(appUserId, userId, couponId);
//            // 新人获取 邀请人赠送的优惠券【新用户登录成功自动领取优惠券】
//            var3 = userInfoService.getShareCoupon(couponRecord);
//        }
//
//        LOGGER.info("系统赠送优惠券给邀请人:{},\n将优惠券赠送他人（优惠券被使用）:{},\n被赠送的优惠券（优惠券被人领取）:{},\n新人获取 邀请人赠送的优惠券【新用户登录成功自动领取优惠券】:{}", ok, var1, var2, var3);
//    }
//
//
//    public void addInvitationRecordsAndBonus2(String userId, String appUserId) {
//        LOGGER.info("用户id：{}", appUserId, "邀请,新人id：{}", userId);
//        //券是否被人领取过，被人领取过，没有下面奖励
//
//        Promotion promotion = new Promotion();
//        promotion.setUserId(userId);
//        promotion.setAppUserId(appUserId);
//        /**
//         * 添加邀请记录 promotion
//         */
//        int var0 = userInfoDao.addInvitationRecord(promotion);
//
//        //向账户中添加奖励
//        /**
//         * 1.给邀请人奖励(新用户注册成功 => 0.2元 ) user_detail
//         */
//        int currentBonus = 20;
//        userInfoDao.updUserAccountInfo(appUserId, currentBonus);
//        /**
//         * 2.添加金额奖励流水记录user_stream_record（当前奖励0.2元）
//         */
//        String streamId = "stream-" + JSBUtil.generateUUID();
//        userInfoDao.addUserStreamRecord(streamId, appUserId, currentBonus);
//    }
//
//
//}
